+2007-04-29 Matthias Clasen <mclasen@redhat.com>
+
+ Fix some issues with reference handling in the printing
+ code. (#429902, Mathias Hasselmann)
+
+ * gtk/gtkprintoperation.c (gtk_print_operation_finalize):
+ Unref the print context, if we have one.
+ (gtk_print_operation_done): Add a default ::done handler
+ that unrefs the print context.
+ (preview_ready): Take a reference on the print operation
+ preview here.
+ (print_pages_idle): ...not here,
+ (preview_print_idle_done): ...and release it here.
+
+ * tests/print-editor.c (preview_cb): Take a reference
+ on the print operation here.
+
2007-04-29 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkprintoperation.c (print_pages_idle): Don't get
if (priv->print_settings)
g_object_unref (priv->print_settings);
+ if (priv->print_context)
+ g_object_unref (priv->print_context);
+
g_free (priv->export_filename);
g_free (priv->job_name);
g_free (priv->custom_tab_label);
g_free (pop->filename);
gtk_print_operation_preview_end_preview (pop->preview);
+
+ g_object_unref (op);
g_free (pop);
}
pop->page_nr = 0;
pop->print_context = context;
+ g_object_ref (preview);
+
gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE + 10,
preview_print_idle,
pop,
return NULL;
}
+static void
+gtk_print_operation_done (GtkPrintOperation *operation)
+{
+ GtkPrintOperationPrivate *priv = operation->priv;
+
+ if (priv->print_context)
+ {
+ g_object_unref (priv->print_context);
+ priv->print_context = NULL;
+ }
+}
+
static gboolean
custom_widget_accumulator (GSignalInvocationHint *ihint,
GValue *return_accu,
class->preview = gtk_print_operation_preview_handler;
class->create_custom_widget = gtk_print_operation_create_custom_widget;
+ class->done = gtk_print_operation_done;
g_type_class_add_private (gobject_class, sizeof (GtkPrintOperationPrivate));
GTK_PRINT_OPERATION_RESULT_APPLY);
g_object_unref (data->op);
-
g_free (data);
}
{
done = TRUE;
- g_object_ref (data->op);
-
g_signal_emit_by_name (data->op, "ready", priv->print_context);
goto out;
}